package rlog

import (
	"fmt"
	"path"
	"runtime"
	"strings"
	"sync/atomic"
	"time"
)

var projectDir = ""
var projectDirLength = 0
var waitWriteLogCount int64

// Init 初始化，需要在 main函数或者main.init里调用。
// 用于计算出项目文件夹地址。
func Init() {
	_, file, _, ok := runtime.Caller(1)
	if ok {
		projectDir = path.Dir(file)
		projectDirLength = len(path.Dir(file)) + 1
	}
}

// InitCustomLayer 初始化，自定义层数。
// 如果在项目文件夹根目录，则填入1；如果在二级目录，填入2；三级目录填入3。
// 用于计算出项目文件夹地址。
func InitCustomLayer(CustomLayer uint) {
	_, file, _, ok := runtime.Caller(1)
	if ok {
		all := strings.ReplaceAll(file, "\\", "/")
		split := strings.Split(all, "/")
		delLength := int(CustomLayer) - 1
		for i := 1; i <= int(CustomLayer); i++ {
			delLength += len(split[len(split)-i])
		}
		projectDir = file[:len(file)-delLength]
		projectDirLength = len(projectDir)
	}
}

// ProjectDir 返回项目main函数的文件夹地址
func ProjectDir() string {
	return projectDir
}

// SetProjectDir 手动设置项目文件夹地址，如果main.go在项目的根目录，请使用 Init 函数，该函数可以自动计算项目所在文件夹位置。
func SetProjectDir(dir string) {
	if strings.HasSuffix(dir, "/") || strings.HasSuffix(dir, "\\") {
		dir = dir[:len(dir)-1]
	}
	projectDir = dir
	projectDirLength = len(dir) + 1
}

// WaitFinish 安全结束日志打印
func WaitFinish() {
	timer := time.NewTimer(time.Second * 10)
	for {
		time.Sleep(time.Millisecond * 10)
		select {
		case <-timer.C:
			return
		default:
			if atomic.LoadInt64(&waitWriteLogCount) <= 0 {
				fmt.Println("\r\n安全结束日志打印：", time.Now())
				return
			}
		}
	}
}
